#
# @lc app=leetcode.cn id=125 lang=python3
#
# [125] 验证回文串
#

"""
本题使用双指针头尾对比是否相同即可

学习两个 Python 的基本函数
  1. isalnum()：用于检查字符串是否只包含字母和数字
    如果字符串中至少有一个字符，并且所有字符都是字母或数字，则该方法返回True；否则，返回False。
  2. lower()：将字符串中的所有大写字符转换为小写
    a. lower()方法不会改变原字符串，因为字符串在Python中是不可变的。它返回一个新的字符串。
    b. 如果字符串包含非ASCII字符，lower()方法会根据Unicode的大小写映射规则来转换字符。但是，某些字符可能没有定义大小写映射，这时这些字符不会被转换。
    c. 对于某些具有多种小写形式的字符（例如土耳其语中的İ），lower()方法可能不会返回预期的结果，因为它可能不遵循特定的语言规则。
    
"""

# @lc code=start
class Solution:
    def isPalindrome(self, s: str) -> bool:
        i, j = 0, len(s) - 1
        while i < j:
            if not s[i].isalnum():
                i += 1
            elif not s[j].isalnum():
                j -= 1
            elif s[i].lower() == s[j].lower():
                i += 1
                j -= 1
            else:
                return False
        return True

# @lc code=end

print(Solution.isPalindrome(Solution, 'A man, a plan, a canal: Panama'))